#include <iostream>
#include<string>
#include<vector>
#include<sstream>
#include <cstdio>
#include <cstdlib>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;
// 实现简易版shell


void split(string buffer,vector<string>* argv)
{
    stringstream ss(buffer);
    string tmp;
    while(ss >> tmp)
    {
        argv->push_back(tmp);
    }
}

#define NUM 32

int main()
{
    // 父进程一直运行，并获取用户输入
    while(true)
    {
        // 1. 获取命令行信息
        char buffer[1024];
        cout << "[myshell@VM]$ ";
        fflush(stdout);
        ssize_t s = read(0, buffer, sizeof(buffer) - 1);
        if(s > 0)
        {
            buffer[s] = 0;
        }
        else
        {
            perror("read");
            continue;
        }
        // 2. 解析命令行信息，获取命令名称和运行参数
        vector<string> argv;
        split(buffer,&argv);
        if(argv.size() == 0)
        {
            continue;
        }
        // 3. 创建子进程，进行程序替换
        pid_t pid = fork();
        if(pid == 0)
        {
            // 子进程
            // 4. 进行程序替换
            char* myargv[NUM];
            int i = 0;
            for(; i < argv.size(); i++)
            {
                myargv[i] = (char*)argv[i].c_str();
            }
            myargv[i] = NULL;
            execvp(myargv[0], myargv);
        }
        // 父进程
        // 5. 进程等待
        int status = 0;
        waitpid(pid, &status, 0);
    }


    return 0;
}